package br.com.leopard.erp.gym.dao.base_sistema;

import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

import br.com.leopard.erp.gym.mapeamento.base_sistema.Acao;
import br.com.leopard.erp.gym.mapeamento.base_sistema.Modulo;
import br.com.leopard.erp.gym.mapeamento.base_sistema.Usuario;
import br.com.leopard.erp.gym.persistence.AbstractDAO;
import br.com.leopard.erp.gym.persistence.ParametroQueryBuilder;

@Stateless
@LocalBean
public class AcaoDAO extends AbstractDAO<Acao, Long> {

	public AcaoDAO() {
		super(Acao.class);
	}

	public List<Acao> findAcoesByAcao(String acao) {
		String query = "Acao.findByAcao";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("acao", acao);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Acao> findAcoesByAcaoEID(String acao, Long idAcao) {
		String query = "Acao.findByAcao";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("acao", acao);
		builder.addParametro("idAcao", idAcao);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Acao> findAcoesByModulo(Modulo modulo) {
		String query = "Acao.findByModulo";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("modulo", modulo);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Acao> findByModuloEAcao(String acao, Modulo modulo) {
		String query = "Acao.findByModuloEAcao";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("modulo", modulo);
		builder.addParametro("acao", acao);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Acao> findByModuloEAcaoEID(String acao, Modulo modulo, Long idAcao) {
		String query = "Acao.findByModuloEAcaoEID";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("modulo", modulo);
		builder.addParametro("acao", acao);
		builder.addParametro("idAcao", idAcao);

		return super.listNamedQuery(query, builder.getParametros());
	}

	@SuppressWarnings("unchecked")
	public List<String> listarAtivas() {

		String strQuery = "SELECT acao.ACAO FROM cfg_acao acao JOIN PMS_MODULO modulo ON modulo.ID_MODULO = acao.ID_MODULO WHERE acao.ATIVO=:ativo AND modulo.ATIVO=:ativo";

		Query query = entityManager.createNativeQuery(strQuery);
		query.setParameter("ativo", true);

		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<String> getAcoesPermitidasUsuario(Usuario usuario) {
		StringBuffer SQL = new StringBuffer();

		SQL.append("SELECT acao.acao FROM CFG_ACAO acao");
		SQL.append("	JOIN PMS_MODULO modulo ON modulo.id_modulo = acao.id_modulo");
		SQL.append("	JOIN EMP_EMPRESA_MODULO empresaModulo ON modulo.id_modulo = empresaModulo.id_modulo");
		SQL.append("	JOIN EMP_EMPRESA_PERFIL empresaPerfil ON empresaPerfil.id_empresa = empresaModulo.id_empresa");
		SQL.append("	JOIN EMP_EMPRESA_PERFIL_MODULO empresaPerfilModulo ON empresaPerfilModulo.id_empresa_perfil= empresaPerfil.id_Empresa_Perfil AND empresaPerfilModulo.id_empresa_modulo = empresaModulo.id_empresa_modulo");
		SQL.append("	JOIN EMP_EMPRESA empresa ON empresa.id_empresa = empresaModulo.id_empresa AND empresa.id_empresa = empresaPerfil.id_empresa");
		SQL.append("	JOIN PMS_PERFIL perfil ON perfil.id_perfil = empresaPerfil.id_perfil");
		SQL.append("	WHERE acao.ativo=:ativo AND empresaModulo.ativo=:ativo AND empresaPerfil.ativo=:ativo AND empresaPerfilModulo.ativo=:ativo AND empresa.ativo=:ativo AND perfil.ativo=:ativo AND perfil.id_perfil =:idPerfil AND empresa.id_empresa=:idEmpresa");

		Query query = super.entityManager.createNativeQuery(SQL.toString());

		return (List<String>) query.setParameter("ativo", true).setParameter("idPerfil", usuario.getPerfil().getIdPerfil()).setParameter("idEmpresa", usuario.getEmpresa().getIdEmpresa()).getResultList();

	}

}